#include"Stack.h"

namespace ltw
{
	// 缺省参数不能声明和定义同时给
	void STInit(ST* ps, int n)
	{
		assert(ps);

		ps->a = (STDataType*)malloc(n * sizeof(STDataType));
		ps->top = 0;
		ps->capacity = n;
	}

	void STDestroy(ST* ps)
	{
		assert(ps);

		free(ps->a);
		ps->a = NULL;
		ps->top = ps->capacity = 0;
	}

	// 栈顶
	// 11:55
	void STPush(ST* ps, STDataType x)
	{
		assert(ps);

		// 满了， 扩容
		if (ps->top == ps->capacity)
		{
			printf("扩容\n");
			int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
			STDataType* tmp = (STDataType*)realloc(ps->a, newcapacity * sizeof(STDataType));
			if (tmp == NULL)
			{
				perror("realloc fail");
				return;
			}

			ps->a = tmp;
			ps->capacity = newcapacity;
		}

		ps->a[ps->top] = x;
		ps->top++;
	}

	void STPop(ST* ps)
	{
		assert(ps);
		assert(!STEmpty(ps));

		ps->top--;
	}

	STDataType STTop(ST* ps)
	{
		assert(ps);
		assert(!STEmpty(ps));

		return ps->a[ps->top - 1];
	}

	int STSize(ST* ps)
	{
		assert(ps);

		return ps->top;
	}

	bool STEmpty(ST* ps)
	{
		assert(ps);

		return ps->top == 0;
	}
}